/**
 * 统一错误处理工具
 */
import { ElMessage } from 'element-plus'
import logger from './logger'

/**
 * 处理API错误
 * @param {Error} error - 错误对象
 * @param {Object} options - 选项
 * @param {string} options.defaultMessage - 默认错误消息
 * @param {boolean} options.showMessage - 是否显示消息提示
 * @param {Function} options.onError - 错误回调
 * @returns {string} 错误消息
 */
export function handleApiError(error, options = {}) {
  const {
    defaultMessage = '操作失败，请稍后重试',
    showMessage = true,
    onError
  } = options

  let message = defaultMessage

  // 记录错误日志
  logger.error('API错误:', error)

  // 处理不同类型的错误
  if (error.response) {
    // HTTP响应错误
    const status = error.response.status
    const data = error.response.data

    switch (status) {
      case 400:
        message = data?.error || data?.detail || data?.message || '请求参数错误，请检查输入信息'
        break
      case 401:
        message = '登录已过期，请重新登录'
        break
      case 403:
        message = data?.error || data?.detail || '没有权限执行此操作'
        break
      case 404:
        message = data?.error || data?.detail || '未找到相关资源'
        break
      case 408:
        message = '请求超时，请稍后重试'
        break
      case 429:
        message = '请求过于频繁，请稍后再试'
        break
      case 500:
        message = '服务器错误，请稍后重试'
        break
      case 502:
      case 503:
      case 504:
        message = '服务暂时不可用，请稍后重试'
        break
      default:
        message = data?.error || data?.detail || data?.message || defaultMessage
    }
  } else if (error.request) {
    // 请求已发出但没有收到响应
    message = '网络错误，请检查网络连接'
  } else if (error.message) {
    // 其他错误
    if (error.message.includes('timeout')) {
      message = '请求超时，请检查网络连接'
    } else if (error.message.includes('Network Error')) {
      message = '网络错误，请检查网络连接'
    } else {
      message = error.message
    }
  }

  // 显示错误消息
  if (showMessage) {
    ElMessage.error(message)
  }

  // 执行错误回调
  if (onError && typeof onError === 'function') {
    onError(error, message)
  }

  return message
}

/**
 * 处理网络错误
 * @param {Error} error - 错误对象
 * @returns {string} 错误消息
 */
export function handleNetworkError(error) {
  return handleApiError(error, {
    defaultMessage: '网络连接失败，请检查网络设置',
    showMessage: true
  })
}

/**
 * 静默处理错误（不显示消息）
 * @param {Error} error - 错误对象
 * @returns {string} 错误消息
 */
export function handleSilentError(error) {
  return handleApiError(error, {
    showMessage: false
  })
}
